public class Main {
    /*
    给你一个二叉树的根节点 root ， 检查它是否轴对称
     */
    public boolean isSymmetric(TreeNode root) {
        if(root == null) {
            return true;
        }
        return isSymmetricChild(root.left,root.right);
    }
    //判断除根外 其他子树的对称
    public boolean isSymmetricChild(TreeNode leftTree,TreeNode rightTree) {
        if(leftTree == null && rightTree != null ||
                leftTree != null && rightTree == null) {//只有一边有子树时
            return false;
        }
        if(leftTree == null && leftTree == rightTree) {//同为null
            return true;
        }
        if(leftTree.val != rightTree.val) {//值不相等
            return false;
        }

        return isSymmetricChild(leftTree.left,rightTree.right) &&
                isSymmetricChild(leftTree.right,rightTree.left);//让子树进行比较
    }
    /*
    给定一个二叉树，判断它是否是高度平衡的二叉树。
    本题中，一棵高度平衡二叉树定义为：
    一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
     */
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode() {}
        TreeNode(int val) { this.val = val; }
        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
    }
 }
    public boolean isBalanced(TreeNode root) {
        if(root == null) {
            return true;
        }
        if(height(root) > 0) {
            return true;
        }
        return false;
    }


    //树的高度
    public int height(TreeNode root) {
        if(root == null) {
            return 0;
        }
        int left = height(root.left);
        if(left < 0) {//左子树判断(可以节省时间)
            return -1;
        }
        int right = height(root.right);
        if (left >= 0 && right >= 0 && Math.abs(left-right) < 2) {
            return Math.max(left,right) + 1;//因为这是求树的高度,所以照常返回高度
        }else {//当有不平衡时(不是平衡二叉树时) 返回-1
            return -1;
        }
    }
}